<?php

include_once "logger/logger.php";

class DBHandler
{
	private $db;
	private $user;
	private $pass;
	private $dbname;
	private $host;
	private $sql;
	private $selCol;
	private $table;
	private $cond;
	private $ordCol;
	private $order;
	private $dwnLimit;
	private $upLimit;


	public function __construct($tabla)
	{
		$this->dbname = "calprec";
		$this->host = "mejorcalidadprecio.com";
		$this->user = "user";
		$this->pass = "passwd";
		$this->table = $tabla;
		
		try
		{
			$this->db = new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->user, $this->pass);
			$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		catch( PDOException $e )
		{
			$log = new Logger("/db/dbdao.php->__construct() - mysql:host=$this->host;dbname=$this->dbname, $this->user , $this->pass",
					$e->getMessage() );
		}
	}
	
	public function __destruct()
	{
		$this->db = null;
	}
	
	private function execSQL()
	{
		try
		{
			$sql = "SELECT $this->selCol FROM $this->table WHERE $this->cond ORDER BY $this->ordCol $this->order LIMIT $this->dwnLimit , $this->upLimit";
			$stmt = $this->db->query($sql);
			return $stmt;
		}
		catch( PDOException $e )
		{
			$log = new Logger("/db/dbdao.php->execSQL(): $sql , $class",$e->getMessage());
		}
	}
	/**
	 * function getAllElements()
	 * devuelve todos los elementos de una tabla, ordenados por ID.
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Clase');
	 */
	public function getAllElements()
	{
		$this->selCol = "*";
		$this->cond = 1;
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		return $this->execSQL();
	}
	
	/**
	 * function getPrizeElements($numElem=10,$order=-1)
	 * @param int $numElem numero de elementos a mostrar
	 * @param int $order >0: ver los mas caros ||  <0: ver los mas baratos
	 * por defecto devuelve los 10 mas baratos.
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Clase');
	 */
	public function getPrecioElements($numElem=10,$order=1)
	{
		$this->selCol = "*";
		$this->cond = "1";
		$this->ordCol = "precio";
		$order>0 ? $this->order="DESC" : $this->order="ASC";
		$this->dwnLimit = 0;
		$this->upLimit = $numElem;
		return $this->execSQL();
	}
	
	/**
	 * function getMarcaElements($marca)
	 * Muestra todos los elementos con una determinada marca
	 * @param string $marca marca de los elementos a mostrar
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Clase');
	 */
	public function getMarcaElements($marca)
	{
		$this->selCol = "*";
		$this->cond = "marca='$marca'";
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		return $this->execSQL();
	}
	
	/**
	 * function getModeloElements($modelo,$marca='-')
	 * @param string $modelo modelo a buscar
	 * @param string $marca marca a buscar
	 * por defecto obvia la marca, pero si le pasas algo que no sea un guión, buscara marca AND modelo.
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Clase');
	 */
	public function getModeloElements($modelo,$marca='-')
	{
		$this->selCol = "*";
		$this->cond = "modelo='$modelo'";
		if( $marca!='-' )
			$this->cond = "marca='$marca' AND $this->cond";
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		return $this->execSQL();
	}
	
	/**
	 * function getIDElements($ids)
	 * Devuelve tantos dispositivos como ids encuentre en la tabla. $ids puede ser un int o un array de int.
	 * No tiene en cuenta el orden de los indices establecidos, así que el controlador deberá tenerlo en cuenta 
	 * en caso de que se estén pidiendo, por ejemplo, las 10 mejores notas.
	 * @param int | int[] $ids int o array de ints con el/los elementos a rescatar de la base de datos.
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Clase');
	 */
	public function getIDElements($ids)
	{
		$this->selCol = "*";
		if( count($ids)>1 )
		{
			$i=0;
			$this->cond = "ID=$ids[0]";
			while( $i<count($ids) )
			{
				$this->cond = "$this->cond OR ID={$ids[$i]}";
				$i++;
			}
		}
		else
			$this->cond = "ID=$ids";	
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = count($ids);
		return $this->execSQL();
	}
	
	/**
	 * function getMarcas()
	 * Devuelve todas las marcas.
	 * Ojo con el controlador, el resultado no se puede procesar con el fetch como los dispositivos, no funcionara.
	 * Hay que procesar una a una todas las entradas en un foreach. La columna que buscas es "marca":
	 * $resp = $dbh->getMarcas();
	 * foreach ($resp as $marca)
	 * {
	 *   $marca = $marca["marca"];
	 *   print "$marca <br>";
	 * }
	 */
	public function getMarcas()
	{
		$this->selCol = "DISTINCT marca";
		$this->cond = 1;
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		return $this->execSQL();
	}
	
	/**
	 * function getMarcaModelos($marca)
	 * devuelve todos los modelos de una marca concreta.
	 * @param string $marca
	 * Ojo con el controlador, el resultado no se puede procesar con el fetch como los dispositivos, no funcionara.
	 * Hay que procesar una a una todas las entradas en un foreach. La columna que buscas es "modelo":
	 * $resp = $dbh->getMarcaModelos($marca);
	 * foreach ($resp as $modelo)
	 * {
	 *   $marca = $marca["marca"];
	 *   print "$marca <br>";
	 * }
	 */
	public function getMarcaModelos($marca)
	{
		$this->selCol = "modelo";
		$this->cond = "marca='$marca'";
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		return $this->execSQL();
	}
	
	/**
	 * function getParams()
	 * devuelve los parametros de la tabla actual.
	 * desde el controlador que lo llame habrá que hacer el fetch al resultado:
	 * $resp = $resp->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'Param');
	 * OJO!! para poder ejecutar el SQL, temporalmente cambia $this->table así que a lo mejor hay algún error 
	 * si los hilos del sistema no nos son favorables. Tenerlo en cuenta para el debug.
	 */
	public function getParams()
	{
		$auxTable = $this->table;
		$this->table = "params";
		$this->selCol = "display,colName,peso";
		$this->cond = "menuTable='$auxTable'";
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = 9999;
		$ret = $this->execSQL();
		$this->table = $auxTable;
		return $ret;
	}
	
	/**
	 * function getRankedItems($ids)
	 * Devuelve info basica para ranking (id,marca,modelo,precio,imgID) de los objetos requeridos.
	 * Como esta funcion no tiene acceso a las notas de los dispositivos, los devuelve con el orden 
	 * original de la base de datos, es decir, IDs ascendientes. El controlador debera ordenarlos.
	 * $ids acepta que sea solo un entero o que sean N (los que sean).
	 * @param int[] $ids
	 */
	public function getRankedItems( $ids )
	{
		$this->selCol = "ID,marca,modelo,precio,imgID";
		if( count($ids)==1 )
			$this->cond = "ID=$ids";
		else if( count($ids)>1 )
		{
			$this->cond = "ID=$ids[0]";
			foreach( $ids as $id )
				$this->cond = "$this->cond OR ID=$id"; 
		}
		else
			$this->cond = "*";
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = count($ids);
		return $this->execSQL();
	}
	
	/**
	 * function getNotas($ids=-1)
	 * En funcion de $ids:
	 *   $ids<0: devuelve la lista completa de notas, con todos los parametros.
	 *   int $ids: devuelve todas las notas del dispositivo concreto, junto a su ID
	 *   int []$ids: devuelve una lista de todas las notas, ordenadas por ID ascendiente
	 *   @param int[] $ids=-1
	 */
	public function getNotas( $ids=-1 )
	{
		$auxTable = $this->table;
		$this->table = "nota$this->table";
		$this->selCol = "*";
		if( $ids<0 )
		{
			$this->cond = "1";
			$this->upLimit = 99999;
		}
		else if( count($id)==1 )
		{
			$this->cond = "ID=$ids";
			$this->upLimit = 1;
		}
		else
		{
			$this->cond = "ID=$ids[0]";
			foreach($ids as $id)
				$this->cond = " OR ID=$id";
			$this->upLimit = count($ids);
		}
		$this->ordCol = "ID";
		$this->order = "ASC";
		$this->dwnLimit = 0;
		$this->upLimit = count($ids);
		$ret = $this->execSQL();
		$this->table = $auxTable;
		return $ret;
	}
}

?>